package com.jt.www.util.excel;

import com.jt.www.util.ConfigUtils;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.*;
import java.util.Map;


@Component

public class WordUtils {
    public static final Logger log = LoggerFactory.getLogger(WordUtils.class);
    private static Configuration configuration = null;
    @Resource
    private ConfigUtils configUtils;
    /**
     * classpath路径
     */
    private String classpath = getClass().getResource("/").getPath();
    /**
     * 指定FreeMarker模板文件的位置
     */
    private String templatePath = "/pdf";

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /**
     * freeMarker模板文件名称
     */
    private String templateFileName = "pdf.ftl";
    /**
     * 图片路径 —— 默认是classpath下面的images文件夹
     */
    private String imagePath = "/images/";
    /**
     * 字体资源文件 存放路径
     */
    private String fontPath = "pdf/font/";
    /**
     * 字体   [宋体][simsun.ttc]   [黑体][simhei.ttf]
     */
    private String font = "simsun.ttc";
    /**
     * 指定编码
     */
    private String encoding = "UTF-8";
    public WordUtils() {
    }

    public static Configuration getConfiguration() {
        return configuration;

    }

    public static void setConfiguration(Configuration configuration) {
        WordUtils.configuration = configuration;
    }

    public static Logger getLog() {
        return WordUtils.log;

    }

    public void createWord(OutputStream outputStream, Map<String, Object> dataMap, String name) {
        //FTL文件所存在的位置
        configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
        configuration.setDefaultEncoding("UTF-8");
        configuration.setClassForTemplateLoading(WordUtils.class, configUtils.getTemplate());

        Template t = null;
        try {
            //文件名
            t = configuration.getTemplate(name);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //导出文档的存放位置
        File outFile = new File("/tempLates/");

        try {
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
            //输出数据到模板
            if (t != null) {
                log.debug("\n\n\n=============================开始生成word报告==============================\n\n\n");
                t.process(dataMap, out);
            }
        } catch (TemplateException | IOException e) {
            e.printStackTrace();
        }

        try (InputStream inputStream = new FileInputStream(outFile)) {
            // 缓冲区
            byte[] buffer = new byte[1024];
            int bytesToRead;
            // 通过循环将读入的Word文件的内容输出到浏览器中
            while ((bytesToRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesToRead);
            }
            outputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }

        outFile.delete();

    }

    /**
     * 生成pdf
     *
     * @param data 传入到freemarker模板里的数据
     * @param out  生成的pdf文件流
     */
//    public void createPDF(Object data, OutputStream out) {
//        // 创建一个FreeMarker实例, 负责管理FreeMarker模板的Configuration实例
//        Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
//        // 指定FreeMarker模板文件的位置
//        cfg.setClassForTemplateLoading(getClass(), templatePath);
//        ITextRenderer renderer = new ITextRenderer();
//        try {
//            // 设置 css中 的字体样式（暂时仅支持宋体和黑体）
//            renderer.getFontResolver().addFont(classpath + fontPath + font, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
//            // 设置模板的编码格式
//            cfg.setEncoding(Locale.CHINA, encoding);
//            // 获取模板文件template.ftl
//             Template template = cfg.getTemplate(templateFileName, encoding);
//            StringWriter writer = new StringWriter();
//            // 将数据输出到html中
//            template.process(data, writer);
//            writer.flush(); String html = writer.toString();
//            // 把html代码传入渲染器中
//            renderer.setDocumentFromString(html);
//            // 解决图片的相对路径问题 ##必须在设置document后再设置图片路径，不然不起作用
//            // 如果使用绝对路径依然有问题，可以在路径前面加"file:/"
//            renderer.getSharedContext().setBaseURL(classpath + imagePath);
//            renderer.layout();
//            renderer.createPDF(out, false);
//            renderer.finishPDF();
//            out.flush();
//            out.close();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
    public ConfigUtils getConfigUtils() {
        return this.configUtils;

    }

    public void setConfigUtils(ConfigUtils configUtils) {
        this.configUtils = configUtils;
    }

    public String getClasspath() {
        return this.classpath;

    }

    public void setClasspath(String classpath) {
        this.classpath = classpath;
    }

    public String getTemplatePath() {
        return this.templatePath;

    }

    public void setTemplatePath(String templatePath) {
        this.templatePath = templatePath;
    }

    public String getTemplateFileName() {
        return this.templateFileName;

    }

    public void setTemplateFileName(String templateFileName) {
        this.templateFileName = templateFileName;
    }

    public String getImagePath() {
        return this.imagePath;

    }

    public void setImagePath(String imagePath) {
        this.imagePath = imagePath;
    }

    public String getFontPath() {
        return this.fontPath;

    }

    public void setFontPath(String fontPath) {
        this.fontPath = fontPath;
    }

    public String getFont() {
        return this.font;

    }

    public void setFont(String font) {
        this.font = font;
    }

    public String getEncoding() {
        return this.encoding;

    }

    public void setEncoding(String encoding) {
        this.encoding = encoding;
    }
}
